package display3D.objet3D
{
	import alternativa.engine3d.core.Clipping;
	import alternativa.engine3d.core.Face;
	import alternativa.engine3d.core.MipMapping;
	import alternativa.engine3d.core.Object3D;
	import alternativa.engine3d.core.Object3DContainer;
	import alternativa.engine3d.core.Sorting;
	import alternativa.engine3d.core.Vertex;
	import alternativa.engine3d.materials.FillMaterial;
	import alternativa.engine3d.materials.TextureMaterial;
	import alternativa.engine3d.objects.Mesh;
	import alternativa.engine3d.primitives.Plane;
	
	import flash.geom.Point;
	import display3D.embed.Texture;
	
	/**
	 * Classe qui représente le sol de la salle3D
	 * @author Arnaud
	 */
	public class Floor
	{
		/**
		 * Coordonnée x du point du milieu
		 */
		protected var _x_milieu:*;
		/**
		 * Coordonnée y du point du milieu
		 */
		protected var _y_milieu:*;
		/**
		 * Coordonnée z du point du milieu
		 */
		protected var _z_milieu:*;
		/**
		 * Distance entre les deux point de la salle les plus éloignés
		 */
		protected var _distance:*;
		/**
		 * Contient tout les objets 3D du sol
		 */
		protected var _objet3D:Vector.<Object3D>;
		
		/**
		 * Constructeur
		 * @param x Coordonnée x du point du milieu
		 * @param y Coordonnée y du point du milieu
		 * @param z Coordonnée z du point du milieu
		 * @param distance Distance entre les deux point de la salle les plus éloignés
		 */
		public function Floor(x:*,y:*,z:*,distance:*)
		{
			this._x_milieu = x;
			this._z_milieu =z;
			this._y_milieu =y;
			this._distance = distance;
			_objet3D = new Vector.<Object3D>;
		}
		
		/**
		 * Dessine la le sol sur la scene
		 * @param scene Conteneur de notre salle3D
		 */
		public function draw(scene:Object3DContainer): void
		{
			var texture:TextureMaterial = new TextureMaterial(new (display3D.embed.Texture.EmbedTextureSol)().bitmapData, true, true, MipMapping.OBJECT_DISTANCE);
			texture.correctUV =true;
			
			var nbX:int = 20;
			var nbY:int = 12;
			
			var meshm:Mesh = new Mesh();
			var v1m:Vertex = meshm.addVertex(_x_milieu+_distance, _y_milieu+_distance,  _z_milieu, 0, 0, "v1m");
			var v4m:Vertex = meshm.addVertex(_x_milieu+_distance, _y_milieu-_distance,  _z_milieu, 0, 10, "v2m");
			var v2m:Vertex = meshm.addVertex(_x_milieu-_distance, _y_milieu+_distance,  _z_milieu, 10, 10, "v3m");
			var v3m:Vertex = meshm.addVertex(_x_milieu-_distance, _y_milieu-_distance,  _z_milieu, 10, 0, "v4m");
			meshm.addQuadFace(v4m,v3m,v2m,v1m, null,"faceMur1");
			meshm.addQuadFace(v1m,v2m,v3m,v4m, null,"faceMur2");
			meshm.calculateFacesNormals(true);
			meshm.clipping = Clipping.FACE_CLIPPING;
			meshm.sorting = Sorting.DYNAMIC_BSP;
			meshm.calculateBounds();
			meshm.setMaterialToAllFaces(texture);
			scene.addChild(meshm);
			_objet3D.push(meshm);
			
			
		}
		
		/**
		 * Supprime le sol de notre scene
		 * @param scene Conteneur de notre salle3D
		 */
		public function supprimerFloor(scene:Object3DContainer):void
		{
			for each (var objet:Object3D in _objet3D)
			{
				scene.removeChild(objet);
			}
		}
		
		/**
		 * Effectue la translation de tout les point du mur et de ses objets par rapport au vecteur
		 * @param vecteur Vecteur de translation
		 */
		public function transformationVectoriel(vecteur:Array):void
		{
			this._x_milieu = this._x_milieu + vecteur[0];
			this._y_milieu = this._y_milieu + vecteur[1];
		
		}
		
		/**
		 * Effectue une rotation de tout les point du mur ainsi que de ses objets
		 * @param pointRotation Point autour du quel s'effectue la rotation
		 * @param angle Anglede la rotation en radian
		 */
		public function transformationRotation(pointRotation:Array,angle:*):void
		{
			var tempX:* = this._x_milieu;
			var tempZ:* = this._y_milieu;
			this._x_milieu =  Math.cos(angle)*(tempX-pointRotation[0]) - Math.sin(angle)*(tempZ-pointRotation[1]) + pointRotation[0];
			this._y_milieu = Math.sin(angle)*(tempX-pointRotation[0]) + Math.cos(angle)*(tempZ-pointRotation[1]) + pointRotation[1];
		}
	}
}